perm filename LISP.LSP[RUT,LSP] blob sn#343760 filedate 1978-03-22 generic text, type T, neo UTF8
(DECLARE (SPECIAL $%DOTFLG %%DTIME %%GCTIME %%PACO %%PAFN %%PAFS %%SPEAK %%TIME
		  %PREVFN% *NOPOINT *NOPOINTDSK *RAISE *RAISEDSK ALLFNS ALLVALS
		  BASE BPEND BPORG CATCH COMMENTFLG DSKIN DSKLENGTH DSKOUT EDITV
		  FILBAK FILBAKBAK FILPRO GETDEF LAPLST LAPSLST LASTWORD MEMBFN
		  NOCALL OBLIST PP PRINLEV REMOB SAVE THROW)
	 (NOCALL SELECTQ1 SUBPR MEMCDR %FILEXT %PRINA %DUMPATOMS %SUBSTR %%PACO
		 %%PAFN %%PAFS)
	 (GLOBALMACRO PLUS DIFFERENCE TIMES QUOTIENT LESSP GREATERP MIN MAX
		      MCONS PUSH POP INCR DECR NOTANY NOTEVERY F:L DO RPTQ))

{;; System macros and supporting functions:⎇

(DEFPROP PLUS (LAMBDA (L) (*EXPAND L '*PLUS)) MACRO)

(DEFPROP DIFFERENCE (LAMBDA (L) (*EXPAND L '*DIF)) MACRO)

(DEFPROP TIMES (LAMBDA (L) (*EXPAND L '*TIMES)) MACRO)

(DEFPROP QUOTIENT (LAMBDA (L) (*EXPAND L '*QUO)) MACRO)

(DEFPROP LESSP
 (LAMBDA (L)
  (LIST '*LESS
	(*EXPAND1 (CDR (REVERSE (CDR L)))
		  '(LAMBDA (X Y) (COND [(AND X [*LESS X Y]) Y])))
	(CAR (LAST L))))
 MACRO)

(DEFPROP GREATERP
 (LAMBDA (L)
  (LIST '*GREAT
	(*EXPAND1 (CDR (REVERSE (CDR L)))
		  '(LAMBDA (X Y) (COND [(AND X [*GREAT X Y]) Y])))
	(CAR (LAST L))))
 MACRO)

(DEFPROP MIN (LAMBDA (L) (*EXPAND L '*MIN)) MACRO)

(DEFPROP MAX (LAMBDA (L) (*EXPAND L '*MAX)) MACRO)

(DEFPROP MCONS (LAMBDA (L) (*EXPAND2 (CDR L) 'CONS)) MACRO)

(DEFPROP PUSH
 (LAMBDA (L) (LIST 'SETQ (CADR L) (LIST 'CONS (CADDR L) (CADR L))))
 MACRO)

(DEFPROP POP
 (LAMBDA (L)
  (LIST 'PROG1
	(LIST 'CAR (CADR L))
	(LIST 'SETQ (CADR L) (LIST 'CDR (CADR L)))))
 MACRO)

(DEFPROP INCR
 (LAMBDA (L) (LIST 'SETQ (CADR L) (LIST 'ADD1 (CADR L))))
 MACRO)

(DEFPROP DECR
 (LAMBDA (L) (LIST 'SETQ (CADR L) (LIST 'SUB1 (CADR L))))
 MACRO)

(DEFPROP NOTANY (LAMBDA (L) (LIST 'NOT (CONS 'SOME (CDR L)))) MACRO)

(DEFPROP NOTEVERY (LAMBDA (L) (LIST 'NOT (CONS 'EVERY (CDR L)))) MACRO)

(DEFPROP F:L (LAMBDA (L) (LIST 'FUNCTION (CONS 'LAMBDA (CDR L)))) MACRO)

(DEFPROP DO (LAMBDA (L) (%DO (CDR L))) MACRO)

(DEFPROP RPTQ
 (LAMBDA (L) (%DO (CONS 'FOR (CONS 'RPTN (CONS 'RPT (CDR L))))))
 MACRO)

(DEFPROP %DO
 (LAMBDA (%L)
  (SELECTQ [CAR %L]
	   [(UNTIL WHILE)
	    (SUBPAIR '(X Y)
		     (LIST (COND [(EQ (CAR %L) 'UNTIL) (CADR %L)]
				 [T (LIST 'NOT (CADR %L))])
			   (CDDR %L))
		     '(PROG (DO!V)
		       DO!L (AND X [RETURN DO!V])
			    (SETQ DO!V (PROGN . Y))
			    (GO DO!L)))]
	   [FOR (SELECTQ [CADDR %L]
			 [(IN ON)
			  (SUBPAIR '(X Y L E)
				   (LIST (CADR %L)
					 (CDDDDR %L)
					 (CADDDR %L)
					 (COND [(EQ (CADDR %L) 'IN) '(CAR DO!L)]
					       [T 'DO!L]))
				   '((LAMBDA (DO!L)
				      (PROG (X DO!V)
				       DO!L (AND [NULL DO!L] [RETURN DO!V])
					    (SETQ X E)
					    (SETQ DO!L (CDR DO!L))
					    (SETQ DO!V (PROGN . Y))
					    (GO DO!L)))
				     L))]
			 [RPT (SUBPAIR '(X Y E)
				       (LIST (CADR %L) (CDDDDR %L) (CADDDR %L))
				       '((LAMBDA (X DO!L)
					  (PROG (DO!V)
					   DO!L (AND [*GREAT X DO!L]
						     [RETURN DO!V])
						(SETQ DO!V (PROGN . Y))
						(SETQ X (ADD1 X))
						(GO DO!L)))
					 1. 
					 E))]
			 [ERROR '"BAD FORMAT - DO"])]
	   [CONS 'PROGN %L]))
 EXPR)

(DEFPROP *EXPAND2
 (LAMBDA (L FN)
  (COND [(NULL (CDR L)) (CAR L)]
	[T (LIST FN (CAR L) (*EXPAND2 (CDR L) FN))]))
 EXPR)

(DEFPROP UNMACEXPAND
 (LAMBDA (X)
  (PROG (XX)
	(COND [(PATOM X) (RETURN X)]
	      [(EQ (CAR X) 'MACROEXPANSION)
	       (RPLACA X (CAADDR X))
	       (RPLACD X (CDADDR X))])
	(SETQ XX X)
   LOOP (UNMACEXPAND (CAR XX))
	(COND [(CONSP (SETQ XX (CDR XX))) (GO LOOP)] [T (RETURN X)])))
 EXPR)

{;; New names for old friends:⎇

(DEFP + *PLUS SUBR)

(DEFP - *DIF SUBR)

(DEFP * *TIMES SUBR)

(DEFP // *QUO SUBR)

(DEFP +I ADD1 SUBR)

(DEFP -I SUB1 SUBR)

(DEFP = EQUAL SUBR)

(DEFP LT *LESS SUBR)

(DEFP GT *GREAT SUBR)

(DEFP PUT PUTPROP SUBR)

(DEFP PRIN PRIN1 SUBR)

(DEFP READL LINEREAD SUBR)

(DEFP MAPL MAPLIST LSUBR)

(DEFP MAPCL MAPCAR LSUBR)

(DEFP CONSCOUNT SPEAK SUBR)

{;; Original UCI LISP functions <with Rutgers modifications>:⎇

(DEFPROP DIR
 (LAMBDA (%UFD)
  (PROG (%LIST)
	(SETQ %UFD (INC (UFDINP (GENSYM) %UFD) NIL))
	(ERRSET (PROG NIL LOOP (SETQ %LIST (CONS (RDFILE) %LIST)) (GO LOOP)))
	(INC %UFD T)
	(RETURN %LIST)))
 EXPR)

(DEFPROP *RENAME (LAMBDA (X Y) (EVAL (CONS 'RENAME (APPEND X Y)))) EXPR)

(DEFPROP FILBAK
 (LAMBDA (FILE BAK)
  (PROG (NAME EXT)
	(COND [(ATOM FILE) (SETQ NAME (CAR (SETQ FILE (NCONS FILE))))]
	      [(ATOM (CDR FILE))
	       (SETQ EXT (CDR FILE))
	       (SETQ NAME (CAAR (SETQ FILE (NCONS FILE))))]
	      [T (SETQ NAME (CADR FILE))
		 (COND [(CONSP NAME)
			(SETQ EXT (CDR NAME))
			(SETQ NAME (CAR NAME))])])
	(SETQ BAK (NCONS (CONS NAME (%FILEXT EXT BAK))))
	(AND FILBAKBAK 
	     [*RENAME BAK (NCONS (CONS NAME (%FILEXT EXT FILBAKBAK)))])
	(APPLY# 'DELETE BAK)
	(RETURN (*RENAME FILE BAK))))
 EXPR)

(DEFPROP %FILEXT
 (LAMBDA (OLDEXT NEWEXT)
  (COND [(NULL OLDEXT) NEWEXT]
	[T (SETQ NEWEXT (AEXPLODE NEWEXT))
	   (READLIST (NCONC NEWEXT 
			    (NTH (AEXPLODE OLDEXT) (ADD1 (LENGTH NEWEXT)))))]))
 EXPR)

(DEFV FILBAK Q)

(DEFV FILBAKBAK QBK)

(DEFPROP DE (LAMBDA (L) (%DEFINE L 'EXPR)) FEXPR)

(DEFPROP DF (LAMBDA (L) (%DEFINE L 'FEXPR)) FEXPR)

(DEFPROP DM (LAMBDA (L) (%DEFINE L 'MACRO)) FEXPR)

(DEFPROP DV
 (LAMBDA (L)
  (SET (CAR L) (CADR L))
  (SETQ ALLVALS (ENTER (CAR L) ALLVALS))
  (SETQ EDITV (CAR L)))
 FEXPR)

(DEFPROP %DEFINE
 (LAMBDA (L P)
  (PROG (X V R)
	(COND [(OR [*LESS (LENGTH L) 3.]
		   [NOT (LITATOM (SETQ X (CAR L)))]
		   [AND [NOT (CONSP (SETQ V (CADR L)))]
			[NOT (AND [LITATOM V] [EQ P 'EXPR])]])
	       (ERROR '"ILLEGAL FORMAT - DE, DF, DM")])
	(SETQ L (CDDR L))
	(SETQ R
	      (COND [(SETQ R (GETL X '(EXPR FEXPR SUBR FSUBR LSUBR MACRO)))
		     (COND [SAVE (APPLY# 'SAVE (NCONS X))]
			   [T (UNBREAK! X) (REMPROP X (CAR R))])
		     (LIST X 'Redefined)]
		    [T X]))
	(PUTPROP X (CONS 'LAMBDA (CONS V L)) P)
	(SETQ ALLFNS (ENTER X ALLFNS))
	(SETQ LASTWORD X)
	(RETURN R)))
 EXPR)

(DEFV SAVE T)

(DEFV ALLFNS NIL)

(DEFV ALLVALS NIL)

(DEFPROP SAVE
 (LAMBDA (X)
  (PROG (D)
	(COND [(SETQ D
		     (GETL (SETQ X (CAR X))
			   '(EXPR FEXPR SUBR FSUBR LSUBR MACRO)))
	       (UNBREAK! X)
	       (PUTPROP X (CONS (CAR D) (CADR D)) 'SAVE)
	       (REMPROP X (CAR D))
	       (RETURN X)])))
 FEXPR)

(DEFPROP UNSAVE
 (LAMBDA (X)
  (PROG (D1 D2)
	(COND [(SETQ D1 (GET (SETQ X (CAR X)) 'SAVE))
	       (UNBREAK! X)
	       (AND [SETQ D2 (GETL X '(EXPR FEXPR SUBR FSUBR LSUBR MACRO))]
		    [REMPROP X (CAR D2)])
	       (PUTPROP X (CDR D1) (CAR D1))
	       (REMPROP X 'SAVE)
	       (RETURN X)])))
 FEXPR)

(DEFPROP DRM (LAMBDA (L) (%DEREAD (CHRVAL (CAR L)) (CADR L) 10.)) FEXPR)

(DEFPROP DSM (LAMBDA (L) (%DEREAD (CHRVAL (CAR L)) (CADR L) 11.)) FEXPR)

(DEFPROP %DEREAD
 (LAMBDA (CHAR FUNC BITS)
  (SETQ CHAR (IASCII CHAR))
  (COND [(NULL FUNC) (SETCHR CHAR 21.) (REMPROP CHAR 'READMACRO)]
	[T (PUTPROP CHAR FUNC 'READMACRO) (SETCHR CHAR BITS)])
  CHAR)
 EXPR)

(DEFPROP DSKIN
 (LAMBDA (%L)
  (PROG (%CH)
	(SETQ %CH (APPLY# 'INPUT (CONS (GENSYM) %L)))
	(%READIN %CH DSKIN)
	(RETURN 'Files-Loaded)))
 FEXPR)

(DEFV DSKIN T)

(DEFPROP %READIN
 (LAMBDA (CHAN PRINT)
  (PROG (*RAISE X SAWLAP)
	(SETQ *RAISE *RAISEDSK)
	(SETQ CHAN (INC CHAN NIL))
	(AND PRINT [LINES 0.])
	(SETQ X
	      (ERRSET (PROG (Y)
		       LOOP (SETQ Y (READ))
			    (COND [(CONSP Y)
				   (AND [EQ (CAR Y) 'LAP] [SETQ SAWLAP T])
				   (AND [CONSP (CDR Y)]
					[LITATOM (CADR Y)]
					[UNBREAK! (CADR Y)])])
			    (SETQ Y (EVAL Y))
			    (COND [(EQ PRINT 'PRINT) (PRINT Y)]
				  [(AND PRINT Y) (MSG Y 1.)])
			    (GO LOOP))
		      ERRORX))
	(AND PRINT [LINES 0.])
	(INC CHAN T)
	(AND SAWLAP 
	     [MAPATOMS (FUNCTION
			(LAMBDA (Y)
			 {;; If any UNDEF props left hanging around by LAP they
			     must reference undefined NOCALLs; Warn user but
			     flag so it won't be printed twice⎇
			 (AND [GET Y 'UNDEF]
			      [NOT (GET Y '%READIN)]
			      [PUTPROP Y T '%READIN]
			      [TTYMSG -1. "*WARNING - NOCALL Function " Y
				      " Not Yet Defined." T])))])
	(AND [NEQ X '$EOF$] [ERR X])))
 EXPR)

(DEFV *RAISEDSK NIL)

(DEFPROP DSKOUT
 (LAMBDA (%%L)
  ((LAMBDA (FILPRO)
    (PROG (%DEV %FNAME *NOPOINT PP)
	  (SETQ *NOPOINT *NOPOINTDSK)
	  (AND [SETQ PP DSKOUT] [LINES 0.])
	  (COND [(%DEVP (SETQ %DEV (CAR %%L))) (SETQ %%L (CDR %%L))]
		[T (SETQ %DEV 'DSK:)])
	  (COND [(LOOKUP %DEV (SETQ %FNAME (CAR %%L)))
		 (SETQ FILPRO NIL)     {; Use existing protection⎇
		 (AND FILBAK 
		      [NULL (SETQ FILPRO (FILBAK (LIST %DEV %FNAME) FILBAK))]
		      [TTYMSG -1. "No Backup: " %FNAME T])])
	  (SETQ %DEV (OUTC (APPLY# 'OUTPUT (LIST (GENSYM) %DEV %FNAME)) NIL))
	  (LINELENGTH DSKLENGTH)
	  (COND [(NULL (SETQ %%L (CDR %%L)))
		 (SETQ %FNAME
		       (READLIST (NCONC (AEXPLODE (COND [(ATOM %FNAME) %FNAME]
							[T (CAR %FNAME)]))
					'(F N S))))
		 (SETQ %%L (LIST %FNAME))
		 (COND [(NOT (BOUNDP %FNAME))
			(SET %FNAME (SORT (APPEND ALLVALS ALLFNS) NIL T))])])
       L1 (COND [(ATOM (CAR %%L)) (EVAL (LIST 'PPL (CAR %%L)))]
		[T (EVAL (CAR %%L))])
	  (AND [SETQ %%L (CDR %%L)] [GO L1])
	  (OUTC %DEV T)
	  (AND DSKOUT [LINES 0.])
	  (RETURN 'File-Dumped)))
   FILPRO))
 FEXPR)

(DEFV DSKOUT T)

(DEFV *NOPOINTDSK NIL)

(DEFV DSKLENGTH 80.)

(PROGN (REMPROP 'LPTLENGTH 'VALUE) (DEFP LPTLENGTH DSKLENGTH VALUE))

(DEFPROP %DEVP
 (LAMBDA (X)
  (OR [EQ (ANTHCHAR X -1.) 58.] [AND [CONSP X] [CONSP (CDR X)]]))
 EXPR)

(DEFPROP TCONC
 (LAMBDA (P X)
  (COND [(NULL P) (CONS (SETQ X (NCONS X)) X)]
	[(ATOM P) (ERROR (LIST P '"BAD ARGUMENT - TCONC"))]
	[(CDR P) (RPLACD P (CDR (RPLACD (CDR P) (NCONS X))))]
	[T (RPLACA (RPLACD P (SETQ X (NCONS X))) X)]))
 EXPR)

(DEFPROP LCONC
 (LAMBDA (PTR X)
  (PROG (XX)
	(COND [(NULL X) (RETURN PTR)]
	      [(OR [ATOM X] [CDR (SETQ XX (LAST X))]) (GO ERROR)]
	      [(NULL PTR) (RETURN (CONS X XX))]
	      [(ATOM PTR) (SETQ X PTR) (GO ERROR)]
	      [(NULL (CAR PTR)) (RETURN (RPLACA (RPLACD PTR XX) X))]
	      [T (RPLACD (CDR PTR) X) (RETURN (RPLACD PTR XX))])
  ERROR (ERROR (LIST X '"BAD ARGUMENT - LCONC"))))
 EXPR)

(DEFPROP DREVERSE
 (LAMBDA (L)
  (PROG (Y Z)
     L1 (COND [(ATOM (SETQ Y L)) (RETURN Z)])
	(SETQ L (CDR L))
	(SETQ Z (RPLACD Y Z))
	(GO L1)))
 EXPR)

(DEFPROP REMOVE
 (LAMBDA (ELT LIST)
  (COND [(ATOM LIST) LIST]
	[(EQUAL (CAR LIST) ELT) (REMOVE ELT (CDR LIST))]
	[(CONS (CAR LIST) (REMOVE ELT (CDR LIST)))]))
 EXPR)

(DEFPROP DREMOVE
 (LAMBDA (X L)
  (COND [(ATOM L) NIL]
	[(EQ X (CAR L))
	 (COND [(CDR L) (RPLACA L (CADR L)) (RPLACD L (CDDR L)) (DREMOVE X L)])]
	[T (PROG (Z)
		 (SETQ Z L)
	      LP (COND [(ATOM (CDR L)) (RETURN Z)]
		       [(EQ X (CADR L)) (RPLACD L (CDDR L))]
		       [T (SETQ L (CDR L))])
		 (GO LP))]))
 EXPR)

(DEFPROP TAILP
 (LAMBDA (X Y)
  (AND X 
       [PROG NIL
	  LP (COND [(ATOM Y) (RETURN NIL)] [(EQ X Y) (RETURN X)])
	     (SETQ Y (CDR Y))
	     (GO LP)]))
 EXPR)

(DEFPROP ASSOC#
 (LAMBDA (A B)
  (PROG NIL
     L1 (COND [(NULL B) (RETURN NIL)] [(EQUAL A (CAAR B)) (RETURN (CAR B))])
	(SETQ B (CDR B))
	(GO L1)))
 EXPR)

(DEFPROP PRINTLEV (LAMBDA ($%X $%N) (TERPRI) (PRINLEV $%X $%N) $%X) EXPR)

(DEFPROP PRINLEV
 (LAMBDA ($%X $%N)
  {;; PRINLEV now uses PRINA so atomic symbols aren't broken over lines;
      Printing resumes in column PRINLEV of the next line⎇
  (COND [(PATOM $%X) (PRINA $%X PRINLEV)]
	[(EQ %PREVFN% $%X) (PRINAC '"\#\" PRINLEV)]
	[(AND [NULL COMMENTFLG] [LITATOM (CAR $%X)] [GET (CAR $%X) 'COMMENT])
	 (PRINAC '"*COMMENT*" PRINLEV)]
	[(EQ $%N 0.) (PRINAC '& PRINLEV)]
	[T (PROG ($%KK $%CL)
		 (AND [*LESS (CHRCT) 12.] [TAB PRINLEV])
		 (PRINC (COND [$%DOTFLG (SETQ $%DOTFLG NIL) '"... "] [T '"("]))
		 (PRINLEV (CAR $%X) (SUB1 $%N))
		 (SETQ $%KK $%X)
	      LP (COND [(MEMCDR $%X $%KK)
			(COND [$%CL (PRINAC '" ...]" PRINLEV) (RETURN NIL)]
			      [T (SETQ $%CL T)])])
		 (SETQ $%KK (CDR $%KK))
		 (COND [(NULL $%KK) (TYOA 41. PRINLEV) (RETURN NIL)]
		       [(PATOM $%KK)
			(PRINAC '" . " PRINLEV)
			(PRINA $%KK PRINLEV)
			(TYOA 41. PRINLEV)
			(RETURN NIL)])
		 (SPACES 1. PRINLEV)
		 (COND [(NOT (PATOM (CAR $%KK)))
			(PRINLEV (CAR $%KK) (SUB1 $%N))]
		       [T (PRINA (CAR $%KK) PRINLEV)])
		 (GO LP))]))
 EXPR)

(DEFV PRINLEV 6.)

(DEFPROP MEMCDR
 (LAMBDA (%X% %Y%)
  (PROG NIL
     L1 (COND [(EQ %X% (CDR %Y%)) (RETURN T)] [(EQ %X% %Y%) (RETURN NIL)])
	(SETQ %X% (CDR %X%))
	(GO L1)))
 EXPR)

(DEFV %PREVFN% NIL)

(DEFV $%DOTFLG NIL)

(DEFPROP LSUBST
 (LAMBDA (X Y Z)
  (COND [(NULL Z) NIL]
	[(PATOM Z) (COND [(EQ Y Z) X] [T Z])]
	[(EQUAL Y (CAR Z)) (NCONC (COPY X) (LSUBST X Y (CDR Z)))]
	[T (CONS (LSUBST X Y (CAR Z)) (LSUBST X Y (CDR Z)))]))
 EXPR)

(DEFPROP SELECTQ
 (LAMBDA (SELCQ)
  (APPLY# 'PROGN (SELECTQ1 (EVAL (CAR SELCQ)) (CDR SELCQ))))
 FEXPR)

(DEFPROP SELECTQ1
 (LAMBDA (M L)
  (PROG (C)
     LP (SETQ C L)
	(COND [(NULL (SETQ L (CDR L))) (RETURN C)]
	      [(OR [EQ (CAR (SETQ C (CAR C))) M]
		   [AND [CONSP (CAR C)] [MEMQ M (CAR C)]])
	       (RETURN (CDR C))])
	(GO LP)))
 EXPR)

(DEFPROP SUBLIS
 (LAMBDA (ALST EXPR) (COND [ALST (SUBPR EXPR ALST NIL)] [T EXPR]))
 EXPR)

(DEFPROP SUBPAIR
 (LAMBDA (OLD NEW EXPR)
  (COND [OLD (SUBPR EXPR OLD (OR NEW '[NIL]))] [T EXPR]))
 EXPR)

(DEFPROP SUBPR
 (LAMBDA (EXPR L1 L2)
  (PROG (D A)
	(COND [(ATOM EXPR) (GO LP)]
	      [(SETQ D (CDR EXPR)) (SETQ D (SUBPR D L1 L2))])
	(SETQ A (SUBPR (CAR EXPR) L1 L2))
	(RETURN (COND [(OR [NEQ A (CAR EXPR)] [NEQ D (CDR EXPR)]) (CONS A D)]
		      [T EXPR]))
     LP (COND [(NULL L1) (RETURN EXPR)]
	      [L2 (COND [(EQ EXPR (CAR L1)) (RETURN (CAR L2))])]
	      [T (COND [(EQ EXPR (CAAR L1)) (RETURN (CDAR L1))])])
	(SETQ L1 (CDR L1))
	(AND L2 [SETQ L2 (OR [CDR L2] '[NIL])])
	(GO LP)))
 EXPR)

(DEFPROP DSUBST
 (LAMBDA (X Y Z)
  (PROG (B)
	(COND [(EQ Y (SETQ B Z)) (RETURN (COPY X))])
     LP (COND [(PATOM Z) (RETURN B)]
	      [(COND [(LITATOM Y) (EQ Y (CAR Z))] [T (EQUAL Y (CAR Z))])
	       (RPLACA Z (COPY X))]
	      [T (DSUBST X Y (CAR Z))])
	(COND [(AND Y [EQ Y (CDR Z)]) (RPLACD Z (COPY X)) (RETURN B)])
	(SETQ Z (CDR Z))
	(GO LP)))
 EXPR)

(DEFPROP RETFROM
 (LAMBDA (FUN VAL)
  (COND [(SETQ FUN (STKSRCH FUN (SPDLPT) NIL)) (OUTVAL FUN VAL)]
	[T (ERROR (LIST FUN '"NO EVAL BLIP - RETFROM"))]))
 EXPR)

(DEFPROP LDIFF
 (LAMBDA (X Y)
  (COND [(EQ X Y) NIL]
	[(NULL Y) X]
	[T (PROG (V Z)
		 (SETQ Z (SETQ V (NCONS (CAR X))))
	    LOOP (SETQ X (CDR X))
		 (COND [(EQ X Y) (RETURN Z)]
		       [(NULL X) (ERROR '"NOT A TAIL - LDIFF")])
		 (SETQ V (CDR (RPLACD V (NCONS (CAR X)))))
		 (GO LOOP))]))
 EXPR)

(DEFPROP NTH
 (LAMBDA (X N)
  (COND [(*GREAT 1. N) (CONS NIL X)]
	[T (PROG NIL
	      LP (COND [(OR [ATOM X] [EQ N 1.]) (RETURN X)])
		 (SETQ X (CDR X))
		 (SETQ N (SUB1 N))
		 (GO LP))]))
 EXPR)

(DEFPROP SUBST
 (LAMBDA (X Y S)
  (COND [(EQUAL Y S) X]
	[(ATOM S) S]
	[T (CONS (SUBST X Y (CAR S)) (SUBST X Y (CDR S)))]))
 EXPR)

(DEFPROP COPY (LAMBDA (X) (SUBST 0. 0. X)) EXPR)

(DEFPROP PUTSYM
 (LAMBDA (L)
  (MAPC (FUNCTION
	 (LAMBDA (X)
	  (COND [(ATOM X) (*PUTSYM X X)] [T (*PUTSYM (CAR X) (EVAL (CADR X)))]))
	 )
	L))
 FEXPR)

(DEFPROP GETSYM
 (LAMBDA (L0)
  (MAPCAR (FUNCTION
	   (LAMBDA (X)
	    (PROG (V)
		  (SETQ V (*GETSYM X))
		  (COND [V (PUTPROP X (NUMVAL V) (CAR L0))]
			[T (TTYMSG -1. X " not in Symbol Table." T)])
		  (RETURN V))))
	  (CDR L0)))
 FEXPR)

(DEFPROP RPUTSYM
 (LAMBDA (L)
  (MAPC (FUNCTION
	 (LAMBDA (X)
	  (COND [(ATOM X) (*RPUTSYM X X)]
		[T (*RPUTSYM (CAR X) (EVAL (CADR X)))])))
	L))
 FEXPR)

(DEFPROP RGETSYM
 (LAMBDA (L0)
  (MAPCAR (FUNCTION
	   (LAMBDA (X)
	    (PROG (V)
		  (SETQ V (*RGETSYM X))
		  (COND [V (PUTPROP X (NUMVAL V) (CAR L0))]
			[T (TTYMSG -1. X " not in Symbol Table." T)])
		  (RETURN V))))
	  (CDR L0)))
 FEXPR)

{;; Rutgers additions:⎇

{;; New predicates:⎇

(DEFPROP LE (LAMBDA (X Y) (NOT (*GREAT X Y))) EXPR)

(DEFPROP GE (LAMBDA (X Y) (NOT (*LESS X Y))) EXPR)

(DEFPROP =0 (LAMBDA (X) (EQ X 0.)) EXPR)

(DEFPROP INP
 (LAMBDA (X Y)
  (COND [(EQ X Y) T]
	[(ATOM Y) NIL]
	[(INP X (CAR Y)) T]
	[T (INP X (CDR Y))]))
 EXPR)

{;; New list-manipulation and property list functions:⎇

(DEFPROP ATTACH
 (LAMBDA (X Y)
  (COND [(CONSP Y) (RPLACD Y (CONS (CAR Y) (CDR Y))) (RPLACA Y X)]
	[(NULL Y) (LIST X)]
	[T (ERROR (LIST Y '"CAN'T ATTACH TO ATOM"))]))
 EXPR)

(DEFPROP ENTER
 (LAMBDA (V L) (COND [(MEMBFN V L) L] [T (CONS V L)]))
 EXPR)

(DEFPROP NCONC1 (LAMBDA (X Y) (NCONC X (LIST Y))) EXPR)

(DEFPROP ADDPROP (LAMBDA (A V I) (PUTPROP A (ENTER V (GET A I)) I)) EXPR)

(DEFPROP PUTLIST
 (LAMBDA (L V I) (MAPC (FUNCTION (LAMBDA (A) (PUTPROP A V I))) L))
 EXPR)

(DEFPROP REMLIST
 (LAMBDA (L I) (MAPC (FUNCTION (LAMBDA (A) (REMPROP A I))) L))
 EXPR)

(DEFPROP REMPROPS
 (LAMBDA (A L) (MAPC (FUNCTION (LAMBDA (I) (REMPROP A I))) L))
 EXPR)

(DEFPROP UNION
 (LAMBDA (L1 L2)
  (PROG (A Z)
   LOOP (COND [(NULL L1) (RETURN (OR A L2))]
	      [(MEMBFN (CAR L1) (OR A L2))]
	      [(NULL A) (SETQ A (SETQ Z (CONS (CAR L1) L2)))]
	      [T (SETQ Z (CDR (RPLACD Z (CONS (CAR L1) L2))))])
	(SETQ L1 (CDR L1))
	(GO LOOP)))
 EXPR)

(DEFPROP INTERSECTION
 (LAMBDA (L1 L2)
  (PROG (A Z)
   LOOP (COND [(NULL L1) (RETURN A)]
	      [(NOT (MEMBFN (CAR L1) L2))]
	      [(NULL A) (SETQ A (SETQ Z (NCONS (CAR L1))))]
	      [T (SETQ Z (CDR (RPLACD Z (NCONS (CAR L1)))))])
	(SETQ L1 (CDR L1))
	(GO LOOP)))
 EXPR)

(DEFV MEMBFN MEMBER)

(DEFPROP INSERT
 (LAMBDA (X L COMPAREFN NODUPS)
  {;; INSERT uses a binary search to insert X into L; The INSERT MERGE and SORT
      routines were copied virtually unchanged from the CMU LISPX package⎇
  (COND
   [(NULL L) (LIST X)]
   [(ATOM L) (ERROR (LIST L '"CAN'T INSERT INTO ATOM"))]
   [T (AND [NULL COMPAREFN] [SETQ COMPAREFN 'LEXORDER])
      (PROG (L1 N N1 Y)
	    (SETQ L1 L)
	    (SETQ N (LENGTH L))
	  A (SETQ N1 (*QUO (ADD1 N) 2.))
	    (SETQ Y (FNTH L1 N1))
	    (COND [(*LESS N 3.)
		   (COND [(COMPAREFN X (CAR Y))
			  (COND [(NOT (AND NODUPS [EQUAL X (CAR Y)]))
				 (RPLACD Y (CONS (CAR Y) (CDR Y)))
				 (RPLACA Y X)])]
			 [(EQ N 1.) (RPLACD Y (CONS X (CDR Y)))]
			 [(COMPAREFN X (CADR Y))
			  (COND [(NOT (AND NODUPS [EQUAL X (CADR Y)]))
				 (RPLACD (CDR Y) (CONS (CADR Y) (CDDR Y)))
				 (RPLACA (CDR Y) X)])]
			 [T (RPLACD (CDR Y) (CONS X (CDDR Y)))])]
		  [(COMPAREFN X (CAR Y))
		   (COND [(NOT (AND NODUPS [EQUAL X (CAR Y)]))
			  (SETQ N (SUB1 N1))
			  (GO A)])]
		  [T (SETQ L1 (CDR Y)) (SETQ N (*DIF N N1)) (GO A)]))
      L]))
 EXPR)

(DEFPROP MERGE
 (LAMBDA (X Y COMPAREFN NODUPS)
  (PROG (U Z)
	(SETQ Z (NCONS NIL))
	(AND [NULL COMPAREFN] [SETQ COMPAREFN 'LEXORDER])
      A (COND [(NULL X) (GO B)]
	      [(NULL Y) (SETQ Y X) (GO B)]
	      [(COMPAREFN (CAR X) (CAR Y)) (SETQ U (CAR X)) (SETQ X (CDR X))]
	      [T (SETQ U (CAR Y)) (SETQ Y (CDR Y))])
	(COND [(OR [NOT NODUPS] [NOT (EQUAL (CADR Z) U)]) (TCONC Z U)])
	(GO A)
      B (COND [(NULL Y) (RETURN (CAR Z))]
	      [T (COND [(OR [NOT NODUPS] [NOT (EQUAL (CADR Z) (CAR Y))])
			(TCONC Z (CAR Y))])
		 (SETQ Y (CDR Y))
		 (GO B)])))
 EXPR)

(DEFPROP SORT
 (LAMBDA (X COMPAREFN NODUPS)
  (PROG (Z)
	(COND [(ATOM X) (RETURN X)] [T (SETQ Z (NCONS (CAR X)))])
	(AND [NULL COMPAREFN] [SETQ COMPAREFN 'LEXORDER])
      A (COND [(NULL (SETQ X (CDR X))) (RETURN Z)]
	      [T (INSERT (CAR X) Z COMPAREFN NODUPS) (GO A)])))
 EXPR)

{;; A fast version of NTH for those who know what they are doing:⎇

(LAP FNTH SUBR)
	(PUSH P 1.)
	(MOVE 1. 2.)
	(PUSHJ P NUMVAL)
	(MOVE 2. 1.)
	(POP P 1.)
 TAG1	(CAIN 2. 1.)
	(POPJ P)
	(SUB 2. (C 0. 0. 1. 0.))
	(HRRZ@ 1. 1.)
	(JRST 0. TAG1)
	NIL

{;; New functions on strings:⎇

(DEFPROP SUBSTRING
 (LAMBDA (STR S E)
  (PROG (LEN NEWSTR)
	(SETQ LEN (LENGTH (SETQ NEWSTR (AEXPLODEC STR))))
	(SETQ S (%SUBSTR S 1. 1. LEN))
	(SETQ E (%SUBSTR E LEN S LEN))
	(COND [(NEQ E LEN)
	       (FREELIST (CDR (SETQ E (FNTH NEWSTR E))))
	       (RPLACD E NIL)]
	      [T (SETQ E (LAST NEWSTR))])
	(RPLACD E '(34.))
	(RETURN (PROG1 (READLIST (SETQ S (CONS 34. (FNTH NEWSTR S))))
		       (RPLACD E NIL)
		       (FREE S)
		       (FREELIST NEWSTR)))))
 EXPR)

(DEFPROP %SUBSTR
 (LAMBDA (V I L H)
  (COND [(NOT (NUMBERP V)) (SETQ V I)]
	[(MINUSP V) (SETQ V (ADD1 (*PLUS H V)))])
  (COND [(OR [*LESS V L] [*GREAT V H]) (ERROR '"STRING TOO SHORT - SUBSTRING")])
  V)
 EXPR)

(DEFPROP CONCAT
 (LAMBDA (X Y)
  (PROG (L)
	(SETQ L (CONS 34. (NCONC (AEXPLODEC X) (AEXPLODEC Y) (LIST 34.))))
	(RETURN (PROG1 (READLIST L) (FREELIST L)))))
 EXPR)

{;; New mapping functions:⎇

(DEFPROP MAPATOMS
 (LAMBDA (%FN) (MAPC (FUNCTION (LAMBDA (%A) (MAPC %FN %A))) OBLIST))
 EXPR)

(DEFPROP EVERY
 (LAMBDA NARGS
  (PROG (FN ARGS)
	(SETQ FN (ARG 1.))
     LP (COND [(*GREAT NARGS 1.)
	       (SETQ ARGS (CONS (ARG NARGS) ARGS))
	       (SETQ NARGS (SUB1 NARGS))
	       (GO LP)])
	(SETQ NARGS (APPEND ARGS NIL)) {; Make arg list the proper length⎇
   LOOP (AND [MEMB NIL NARGS] [RETURN T])
	(MAP (FUNCTION
	      (LAMBDA (L1 L2)
	       (COND [(ATOM (CAR L1)) (ERROR '"NON-NULL TAIL - EVERY/SOME")])
	       (RPLACA L2 (CAAR L1))
	       (RPLACA L1 (CDAR L1))))
	     NARGS 
	     ARGS)
	(COND [(APPLY FN ARGS) (GO LOOP)] [T (RETURN NIL)])))
 EXPR)

(DEFPROP SOME
 (LAMBDA NARGS
  (PROG (FN ARGS ANS)
	(SETQ FN (ARG 1.))
     LP (COND [(*GREAT NARGS 1.)
	       (SETQ ARGS (CONS (ARG NARGS) ARGS))
	       (SETQ NARGS (SUB1 NARGS))
	       (GO LP)])
	(SETQ NARGS (APPEND ARGS NIL)) {; Make arg list the proper length⎇
   LOOP (AND [MEMB NIL NARGS] [RETURN NIL])
	(MAP (FUNCTION
	      (LAMBDA (L1 L2)
	       (COND [(ATOM (SETQ ANS (CAR L1)))
		      (ERROR '"NON-NULL TAIL - EVERY/SOME")])
	       (RPLACA L2 (CAAR L1))
	       (RPLACA L1 (CDAR L1))))
	     NARGS 
	     ARGS)
	(COND [(APPLY FN ARGS) (RETURN ANS)] [T (GO LOOP)])))
 EXPR)

(DEFPROP SUBSET
 (LAMBDA (FN L)
  (PROG (A)
	(SETQ A (NCONS NIL))
   LOOP (COND [(NULL L) (RETURN (CAR A))]
	      [(ATOM L) (ERROR '"NON-NULL TAIL - SUBSET")]
	      [(FN (CAR L)) (TCONC A (CAR L))])
	(SETQ L (CDR L))
	(GO LOOP)))
 EXPR)

{;; New functions for controlling evaluation:⎇

(DEFPROP THROW
 (LAMBDA (L)
  (SETQ THROW (EVAL (CAR L)))
  (SETQ CATCH (AND [CDR L] [CADR L]))
  (ERR 'THROW))
 FEXPR)

(DEFPROP CATCH
 (LAMBDA (L)
  (COND [(OR [%CATCH (ERRSET (EVAL (CAR L)))] [NULL (SETQ L (CDR L))])
	 THROW]
	[(ATOM (CAR L)) (COND [(EQ CATCH (CAR L)) THROW] [T (ERR 'THROW)])]
	[T (APPLY# 'SELECTQ (CONS 'CATCH (APPEND L '((ERR 'THROW)))))]))
 FEXPR)

(DEFPROP %CATCH
 (LAMBDA (V)
  {;; %CATCH is called from compiled code⎇
  (COND [(CONSP V) (SETQ THROW (CAR V)) (FREE V) T]
	[(NEQ V 'THROW) (ERR V)]))
 EXPR)

(DEFPROP TIMER
 (LAMBDA (%L)
  (PROG (%TIME %SPEAK %GCTIME %DTIME %V)
	(COND [%L (SETQ %TIME (TIME))
		  (SETQ %GCTIME (GCTIME))
		  (SETQ %DTIME (DTIME))
		  (SETQ %SPEAK (SPEAK))
		  (SETQ %V (APPLY# 'PROGN %L))]
	      [T (SETQ %TIME %%TIME)
		 (SETQ %GCTIME %%GCTIME)
		 (SETQ %DTIME %%DTIME)
		 (SETQ %SPEAK %%SPEAK)])
	(SETQ %SPEAK (*DIF (SPEAK) %SPEAK))
	(SETQ %TIME (*DIF (TIME) %TIME))
	(SETQ %GCTIME (*DIF (GCTIME) %GCTIME))
	(SETQ %DTIME (*DIF (DTIME) %DTIME))
	(PROG (BASE)
	      (SETQ BASE -10.)
	      (TTYMSG 0. %TIME " msec CPU (" %GCTIME " msec GC), " %DTIME
		      " msec clock, " %SPEAK " conses" T))
	(COND [(NULL %L)
	       (SETQ %%TIME (TIME))
	       (SETQ %%GCTIME (GCTIME))
	       (SETQ %%DTIME (DTIME))
	       (SETQ %%SPEAK (SPEAK))])
	(RETURN %V)))
 FEXPR)

(DEFV %%TIME 0.)

(DEFV %%DTIME 0.)

(DEFV %%GCTIME 0.)

(DEFV %%SPEAK 0.)

(DEFPROP BOUNDP
 (LAMBDA (X)
  (AND [LITATOM X] [SETQ X (GET X 'VALUE)] [NEQ (CDR X) (UNBOUND)]))
 EXPR)

{;; Core expansion functions:⎇

(DEFPROP EXPFS (LAMBDA (N) (REALLOC 0. 0. 0. 0. N)) EXPR)

(DEFPROP EXPFWS (LAMBDA (N) (REALLOC N 0. 0. 0. 0.)) EXPR)

(DEFPROP EXPBPS (LAMBDA (N) (REALLOC 0. N 0. 0. 0.)) EXPR)

{;; New IO functions:⎇

(DEFPROP GETDEF
 (LAMBDA (%L)
  {;; Fast GETDEF copied with some modifications from CMU; Scans for expressions
      starting in column 1.  with the function a member of GETDEF and the first
      argument a member of %L (must be space or CR following name)⎇
  (PROG (%D %F %R)
	(COND [(%DEVP (CAR %L)) (SETQ %D (CAR %L)) (SETQ %L (CDR %L))]
	      [T (SETQ %D 'DSK:)])
	(SETQ %D (INC (APPLY# 'INPUT (LIST (GENSYM) %D (CAR %L))) NIL))
	(SETQ %L (CDR %L))
	(LINES 0.)
	(SETQ %R
	 (ERRSET
	  (PROG (%C %X %Y)
	   LOOP (COND [(MEMB (SETQ %C (TYI)) '(10. 11. 12. 13.)) (GO LOOP)]
		      [(MEMB %C '(40. 91.))
		       (COND [(AND [LITATOM (SETQ %X (READ))]
				   [MEMB %X GETDEF]
				   [LITATOM (SETQ %Y (RDNAM))]
				   [OR [NEQ %Y (SETQ %Y (INTERN %Y))]
				       [APPLY# 'REMOB (NCONS %Y)]]
				   [MEMB %Y %L]
				   [NOT (MEMB (PEEKC) '(40. 91.))])
			      (UNTYI %C)
			      (UNBREAK! %Y)
			      (PRINA (EVAL (MCONS %X %Y (READ))))
			      (SPACES 1.)
			      (SETQ %F T)])])
		(COND [(NEQ (TYI) 10.) {; Give him an (old) comment char for
					  fast ignore of rest of line⎇
		       (UNTYI 25.)])
		(GO LOOP))
	  ERRORX))
	(LINES 0.)
	(INC %D T)
	(AND [NEQ %R '$EOF$] [ERR %R])
	(RETURN (COND [%F 'Functions-Loaded] [T 'None-Found]))))
 FEXPR)

(DEFV GETDEF (DEFPROP DEFP DEFV SETQ DE DF DM LAP DRM DSM))

(DEFPROP TYPE
 (LAMBDA (%F)
  (SETQ %F (INC (APPLY# 'INPUT (CONS (GENSYM) %F)) NIL))
  (LINES 0.)
  (ERRSET (PROG NIL LOOP (TYO (TYI)) (GO LOOP)))
  (LINES 0.)
  (INC %F T)
  (IASCII 0.))
 FEXPR)

(DEFPROP DIRF
 (LAMBDA (L)
  (PROG (%UFD %SPEC)
	(SETQ %SPEC '*)
	(COND [(NULL L) (GO OK)]
	      [(CDR L) (SETQ %SPEC (CADR L))]
	      [(NOT (%DEVP (CAR L))) (SETQ %SPEC (CAR L)) (GO OK)])
	(SETQ %UFD (CAR L))
     OK (SETQ %UFD (INC (UFDINP (GENSYM) %UFD) NIL))
	(AND [ATOM %SPEC] [SETQ %SPEC (CONS %SPEC '*)])
	(LINES 0.)
	(ERRSET (PROG (%FILE)
		 LOOP (SETQ %FILE (RDFILENAM))
		      (COND [(AND [OR [EQ (CAR %SPEC) '*]
				      [EQSTR (CAR %SPEC)
					     (COND [(ATOM %FILE) %FILE]
						   [T (CAR %FILE)])]]
				  [OR [EQ (CDR %SPEC) '*]
				      [AND [CONSP %FILE]
					   [EQSTR (CDR %SPEC) (CDR %FILE)]]])
			     (PRIN1 %FILE)
			     (TERPRI)])
		      (GO LOOP)))
	(INC %UFD T)
	(RETURN (IASCII 0.))))
 FEXPR)

(DEFPROP HGHIN
 (LAMBDA (L)
  (PROG (BPORG BPEND)
	(SETQ BPORG (HGHORG NIL))
	(SETQ BPEND (HGHEND))
	(SETQ L (ERRSET (APPLY# 'DSKIN L) ERRORX))
	(HGHORG BPORG)
	(HGHCOR NIL)
	(COND [(ATOM L) (ERR L)] [T (RETURN (CAR L))])))
 FEXPR)

(DEFPROP DUMPATOMS
 (LAMBDA (L)
  {;; The interesting thing here is to dump the atoms to be REMOBed in such a
      way that they can be restored even if the system is REALLOCated⎇
  (PROG (A D BASE *NOPOINT REMOBL)
	(SETQ BASE 8.)
	(SETQ *NOPOINT NIL)
	(OR L [SETQ L '((REMOB . LSP))])
	(SETQ L (OUTC (APPLY# 'OUTPUT (CONS (GENSYM) L)) NIL))
	(SETQ REMOBL (REVERSE REMOB))
   LOOP (COND [(NULL REMOBL) (GO DONE)]
	      [(MEMB (SETQ A (CAR REMOBL)) (SETQ REMOBL (CDR REMOBL)))
	       (SETQ REMOBL (DREMOVE A REMOBL))])
	(COND [(SETQ D (GETL A '(SUBR FSUBR LSUBR)))
	       (%DUMPATOMS A (LIST 'NUMVAL (MAKNUM (CADR D) 'FIXNUM)) (CAR D))])
	(COND [(SETQ D (GET A 'SYM)) (%DUMPATOMS A D 'SYM)])
	(COND [(SETQ D (GET A 'VALUE))
	       (%DUMPATOMS A 
			   (LIST 'NUMVAL
				 (LIST '*PLUS
				       (*DIF (MAKNUM D 'FIXNUM) (EXAMINE 9.))
				       '(EXAMINE 9.)))
			   'VALUE)
	       (AND [SETQ A (ASSOC D LAPLST)] [SETQ LAPLST (DREMOVE A LAPLST)])
	       (OR [MEMB D LAPSLST] [SETQ LAPSLST (CONS D LAPSLST)])])
	(GO LOOP)
   DONE (SPRINT (LIST 'DEFV 'REMOB REMOB) 1.)
	(TERPRI)
	(OUTC L T)
	(APPLY# 'REMOB REMOB)
	(SETQ REMOB NIL)))
 FEXPR)

(DEFPROP %DUMPATOMS
 (LAMBDA (A D P)
  (SPRINT (LIST 'PUTPROP (LIST 'QUOTE A) D (LIST 'QUOTE P)) 1.))
 EXPR)

(DEFPROP PRINA
 (LAMBDA (X COL)
  {;; PRINA and PRINAC use special vars to pass info to %PRINA in order to save
      stack space⎇
  (SETQ %%PACO (OR COL 1.))
  (SETQ %%PAFN 'PRIN1)
  (SETQ %%PAFS 'FLATSIZE)
  (%PRINA X))
 EXPR)

(DEFPROP PRINAC
 (LAMBDA (X COL)
  (SETQ %%PACO (OR COL 1.))
  (SETQ %%PAFN 'PRINC)
  (SETQ %%PAFS 'FLATSIZEC)
  (%PRINA X))
 EXPR)

(DEFPROP %PRINA
 (LAMBDA (X)
  (COND [(PATOM X)
	 (AND [*LESS (CHRCT) (*PLUS (%%PAFS X) 3.)] [TAB %%PACO])
	 (%%PAFN X)]
	[T (AND [*LESS (CHRCT) 14.] [TAB %%PACO])
	   (TYO 40.)
	   (PROG (L)
		 (SETQ L X)
	    LOOP (%PRINA (CAR L))
		 (COND [(PATOM (SETQ L (CDR L)))
			(COND [L (AND [*LESS (CHRCT) 3.] [TAB %%PACO])
				 (PRINC '" . ")
				 (%PRINA L)])
			(TYOA 41. %%PACO)
			(RETURN X)]
		       [T (SPACES 1. %%PACO) (GO LOOP)]))]))
 EXPR)

(DEFPROP PRINL
 (LAMBDA (L COL)
  (OR COL [SETQ COL 1.])
  (COND [(CONSP L)
	 (PRINA (CAR L) COL)
	 (MAPC (FUNCTION (LAMBDA (X) (SPACES 1. COL) (PRINA X COL))) (CDR L))])
  L)
 EXPR)

(DEFPROP PRINLC
 (LAMBDA (L COL)
  (OR COL [SETQ COL 1.])
  (COND [(CONSP L)
	 (PRINAC (CAR L) COL)
	 (MAPC (FUNCTION (LAMBDA (X) (SPACES 1. COL) (PRINAC X COL))) (CDR L))])
  L)
 EXPR)

(DEFPROP PRINTC (LAMBDA (X) (TERPRI) (PROG1 (PRINC X) (TYO 32.))) EXPR)

(DEFPROP TYOA
 (LAMBDA (N C) (AND [=0 (CHRCT)] [TAB (OR C 1.)]) (TYO N))
 EXPR)

(DEFPROP SPACES
 (LAMBDA (N COL)
  (COND [(*LESS (CHRCT) N) (TAB (OR COL 1.))]
	[(EQ N 1.) (TYO 32.)]
	[T (TAB (*PLUS (CHRPOS) N))])
  NIL)
 EXPR)

(DEFPROP MSG
 (LAMBDA (%L)
  (MAPC (FUNCTION
	 (LAMBDA (I)
	  (COND [(EQ I T) (TERPRI)]
		[(NUMBERP I)
		 (COND [(*LESS I 1.) (LINES (MINUS I))] [T (SPACES I)])]
		[(STRINGP I) (PRINAC I)]
		[(AND [CONSP I] [EQ (CAR I) 'E]) (EVAL (CADR I))]
		[(AND [CONSP I] [EQ (CAR I) 'T]) (TAB (EVAL (CADR I)))]
		[T (PRINA (EVAL I))])))
	%L))
 FEXPR)

(DEFPROP TTYMSG
 (LAMBDA (%L) (OUTC (PROG1 (OUTC NIL NIL) (TALK) (APPLY# 'MSG %L)) NIL))
 FEXPR)

(DEFPROP TTYIN
 (LAMBDA (L)
  (PROG (CH)
	(SETQ CH (INC NIL NIL))
	(RETURN (PROG1 (APPLY# 'PROGN L) (INC CH NIL)))))
 FEXPR)

(DEFPROP TTYOUT
 (LAMBDA (L)
  (PROG (CH)
	(SETQ CH (OUTC NIL NIL))
	(RETURN (PROG1 (APPLY# 'PROGN L) (OUTC CH NIL)))))
 FEXPR)

(DEFPROP PEEKC (LAMBDA NIL (UNTYI (TYI))) EXPR)

(DEFPROP DELIM
 (LAMBDA (%C) (EQ (BOOLE 1. 7. (LSH (MODCHR %C NIL) -22.)) 2.))
 EXPR)

(NOCOMPILE
(DEFV LISPFNS ((DECLARE (SPECIAL $%DOTFLG %%DTIME %%GCTIME %%PACO %%PAFN 
	       %%PAFS %%SPEAK %%TIME %PREVFN% *NOPOINT *NOPOINTDSK *RAISE 
	       *RAISEDSK ALLFNS ALLVALS BASE BPEND BPORG CATCH COMMENTFLG 
	       DSKIN DSKLENGTH DSKOUT EDITV FILBAK FILBAKBAK FILPRO GETDEF 
	       LAPLST LAPSLST LASTWORD MEMBFN NOCALL OBLIST PP PRINLEV REMOB 
	       SAVE THROW) (NOCALL SELECTQ1 SUBPR MEMCDR %FILEXT %PRINA 
	       %DUMPATOMS %SUBSTR %%PACO %%PAFN %%PAFS) (GLOBALMACRO PLUS 
	       DIFFERENCE TIMES QUOTIENT LESSP GREATERP MIN MAX MCONS PUSH 
	       POP INCR DECR NOTANY NOTEVERY F:L DO RPTQ)) (;; System macros 
	       and supporting functions:) (F: PLUS DIFFERENCE TIMES QUOTIENT 
	       LESSP GREATERP MIN MAX MCONS PUSH POP INCR DECR NOTANY 
	       NOTEVERY F:L DO RPTQ %DO *EXPAND2 UNMACEXPAND) (*PG*) 
	       (;; New names for old friends:) (DEFP + *PLUS SUBR) 
	       (DEFP - *DIF SUBR) (DEFP * *TIMES SUBR) (DEFP // *QUO SUBR) 
	       (DEFP +I ADD1 SUBR) (DEFP -I SUB1 SUBR) (DEFP = EQUAL SUBR) 
	       (DEFP LT *LESS SUBR) (DEFP GT *GREAT SUBR) (DEFP PUT PUTPROP 
	       SUBR) (DEFP PRIN PRIN1 SUBR) (DEFP READL LINEREAD SUBR) 
	       (DEFP MAPL MAPLIST LSUBR) (DEFP MAPCL MAPCAR LSUBR) 
	       (DEFP CONSCOUNT SPEAK SUBR) (*PG*) (;; Original UCI LISP 
	       functions <with Rutgers modifications>:) (F: DIR *RENAME 
	       FILBAK %FILEXT (V: FILBAK FILBAKBAK) DE DF DM DV %DEFINE 
	       (V: (SAVE T) (ALLFNS NIL) (ALLVALS NIL)) SAVE UNSAVE DRM DSM 
	       %DEREAD DSKIN (V: (DSKIN T)) %READIN (V: (*RAISEDSK NIL)) 
	       DSKOUT (V: (DSKOUT T) (*NOPOINTDSK NIL) (DSKLENGTH 80.)) 
	       (PROGN (REMPROP (QUOTE LPTLENGTH) (QUOTE VALUE)) (DEFP 
	       LPTLENGTH DSKLENGTH VALUE)) %DEVP TCONC LCONC DREVERSE REMOVE 
	       DREMOVE TAILP ASSOC# PRINTLEV PRINLEV (V: PRINLEV) MEMCDR 
	       (V: (%PREVFN% NIL) ($%DOTFLG NIL)) LSUBST SELECTQ SELECTQ1 
	       SUBLIS SUBPAIR SUBPR DSUBST RETFROM LDIFF NTH SUBST COPY 
	       PUTSYM GETSYM RPUTSYM RGETSYM) (*PG*) (;; Rutgers additions:) 
	       (;; New predicates:) (F: LE GE =0 INP) (;; New 
	       list-manipulation and property list functions:) (F: ATTACH 
	       ENTER NCONC1 ADDPROP PUTLIST REMLIST REMPROPS UNION 
	       INTERSECTION (V: MEMBFN) INSERT MERGE SORT (;; A fast version 
	       of NTH for those who know what they are doing:) ((LAP FNTH 
	       SUBR) (PUSH P 1.) (MOVE 1. 2.) (PUSHJ P NUMVAL) (MOVE 2. 1.) 
	       (POP P 1.) TAG1 (CAIN 2. 1.) (POPJ P) (SUB 2. (C 0. 0. 1. 0.)) 
	       (HRRZ@ 1. 1.) (JRST 0. TAG1) NIL)) (;; New functions on 
	       strings:) (F: SUBSTRING %SUBSTR CONCAT) (;; New mapping 
	       functions:) (F: MAPATOMS EVERY SOME SUBSET) (;; New functions 
	       for controlling evaluation:) (F: THROW CATCH %CATCH TIMER 
	       (V: (%%TIME 0.) (%%DTIME 0.) (%%GCTIME 0.) (%%SPEAK 0.)) 
	       BOUNDP) (;; Core expansion functions:) (F: EXPFS EXPFWS EXPBPS) 
	       (;; New IO functions:) (F: GETDEF (V: GETDEF) TYPE DIRF HGHIN 
	       DUMPATOMS %DUMPATOMS PRINA PRINAC %PRINA PRINL PRINLC PRINTC 
	       TYOA SPACES MSG TTYMSG TTYIN TTYOUT PEEKC DELIM)))
)